import re
from functools import wraps

from FasterRunner.settings import logger


def get_invoke_name(func):
    if hasattr(func, "__name__"):
        return str(func.__module__) + "." + func.__name__
    else:
        raw = str(func.func)
        search_obj = re.search(r'<bound method (.*) of', raw)
        if search_obj:
            return str(func.func.__module__) + "." + search_obj.group(1)
        else:
            return "未定义"


def request_log(level):
    def wrapper(func):
        @wraps(func)
        def inner_wrapper(request, *args, **kwargs):
            func_name = get_invoke_name(func)
            # 格式化JSON响应输出
            # msg_data = "invoke 【{func_name}】,data:\n{data}".format(func_name=func_name, data=parser.format_json(request.data))
            msg_data = "invoke 【{func_name}】,data:{data}".format(func_name=func_name, data=request.data)
            msg_params = "invoke 【{func_name}】,params:{params}".format(
                func_name=func_name,
                params=request.query_params)
            if level == 'INFO':
                if request.data:
                    logger.info(msg_data)
                if request.query_params:
                    logger.info(msg_params)
                if args or kwargs:
                    logger.info("invoke 【{func_name}】,args:{args},kwargs:{kwargs}".format(func_name=func_name, args=args, kwargs=kwargs))
                if not request.data and not request.query_params and not args and not kwargs:
                    logger.info(msg_params)
            elif level == 'DEBUG':
                if request.data:
                    logger.debug(msg_data)
                if request.query_params:
                    logger.debug(msg_params)
                if args or kwargs:
                    logger.info("invoke 【{func_name}】,args:{args},kwargs:{kwargs}".format(func_name=func_name, args=args, kwargs=kwargs))
                if not request.data and not request.query_params and not args and not kwargs:
                    logger.debug(msg_params)
            ret = func(request, *args, **kwargs)
            if hasattr(ret, 'data'):
                msg_ret = "invoke 【{func_name}】 end,Response:{response}".format(func_name=func_name, response=ret.data)
            else:
                msg_ret = ret
            logger.info(msg_ret)
            return ret

        return inner_wrapper

    return wrapper
